import 'package:flutter/cupertino.dart';
import 'package:ideology/shared/widgets/file_explorer/file_explorer_theme_data.dart';

import 'file_node.dart';
import 'node_tile_state.dart';

/// # NodeTile
///
/// 文件树中的单个节点（文件或文件夹）的 UI 组件。
///
/// - 由 [FileExplorerListView] 递归构建；
/// - 内部状态逻辑在 [NodeTileState] 中实现（如：展开/重命名/悬停交互）；
/// - 可通过回调与外部交互：展开、选择、打开、删除、重命名；
/// - 可配置样式（主题、颜色、行高、动画时长）。
///
/// ## 工作方式
/// - **文件夹节点**：
///   - 可展开/收起，显示子节点；
///   - 子节点由 [getChildren] 或 [resolveChildren] 提供；
/// - **文件节点**：
///   - 可触发 [onOpen]；
/// - **选中状态**：由 [selectedPath] 决定；
/// - **颜色**：文件颜色可由 [fileColorResolver] 自定义；
/// - **路径**：逻辑路径由 [path] 表示，若 [FileNode.fullPath] 为空时，可使用 [realPathResolver] 映射为真实路径。
class NodeTile extends StatefulWidget {
  /// 节点数据（文件/文件夹）
  final FileNode node;

  /// 当前层级深度（根=0）
  final int depth;

  /// 节点的逻辑路径
  final String path;

  /// 是否处于展开状态（仅文件夹有效）
  final bool expanded;

  /// 是否处于选中状态
  final bool selected;

  /// 是否处于“加载中”状态（懒加载子节点时）
  final bool isLoading;

  /// 当前节点的 children 提供器（通常优先返回缓存数据）
  final List<FileNode> Function() getChildren;

  /// 根据 `(node, path)` 解析子节点（适用于二级及以下，用于保持缓存策略一致）
  final List<FileNode> Function(FileNode node, String path) resolveChildren;

  /// 展开/折叠节点时触发
  final Future<void> Function(FileNode node, String path) onToggle;

  /// 仅选中节点（不触发打开）
  final void Function(String path, FileNode node) onSelect;

  /// 打开节点（仅文件有效，文件夹一般不调用）
  final void Function(String path, FileNode node) onOpen;

  /// 删除节点（文件或文件夹）
  final Future<void> Function(String path, FileNode node) onDelete;

  /// 重命名节点（返回 true 表示成功）
  final Future<bool> Function(String path, FileNode node, String newName)
  onRename;

  /// 判断某路径是否已展开
  final bool Function(String path) isExpanded;

  /// 当前选中的逻辑路径（用于渲染高亮）
  final String? selectedPath;

  /// UI 主题（颜色、行高、动画时长等）
  final FileExplorerThemeData theme;

  /// 文件颜色解析函数（根据文件名决定颜色）
  final Color Function(String fileName)? fileColorResolver;

  /// 每一行的高度
  final double rowHeight;

  /// 展开/收起的动画时长
  final Duration animDuration;

  /// 逻辑路径 → 真实路径 的解析回调
  /// （当 [node.fullPath] 为空时使用）
  final String Function(String logicalPath, FileNode node)? realPathResolver;

  /// 构造函数
  const NodeTile({
    super.key,
    required this.node,
    required this.depth,
    required this.path,
    required this.expanded,
    required this.selected,
    required this.isLoading,
    required this.getChildren,
    required this.resolveChildren,
    required this.onToggle,
    required this.onSelect,
    required this.onOpen,
    required this.onDelete,
    required this.onRename,
    required this.isExpanded,
    required this.selectedPath,
    required this.theme,
    required this.fileColorResolver,
    required this.rowHeight,
    required this.animDuration,
    this.realPathResolver,
  });

  @override
  State<NodeTile> createState() => NodeTileState();
}
